1
2
3
4
5
6
7 package gov.bnl.gums;
8
9 import java.io.IOException;
10 import java.net.URL;
11 import java.util.*;
12 import org.apache.commons.beanutils.MethodUtils;
13 import org.apache.commons.digester.*;
14 import org.apache.commons.logging.Log;
15 import org.apache.commons.logging.LogFactory;
16 import org.xml.sax.SAXException;
17
18 /*** Contains the logic on how to parse an XML configuration file to create a
19 * correctly built Configuration object.
20 *
21 * @author Gabriele Carcassi
22 */
23 class ConfigurationToolkit {
24 private static Log log = LogFactory.getLog(ConfigurationToolkit.class);
25
26 static Configuration loadConfiguration(URL url) throws IOException, SAXException {
27 Digester digester = retrieveDigester();
28 Configuration conf = new Configuration();
29 digester.push(conf);
30 log.trace("Loading the configuration from url '" + url + "'");
31 return (Configuration) digester.parse(url.openStream());
32 }
33
34 static Configuration loadConfiguration(String filename) throws IOException, SAXException {
35 Digester digester = retrieveDigester();
36 Configuration conf = new Configuration();
37 digester.push(conf);
38 log.trace("Loading the configuration from file '" + filename + "'");
39 return (Configuration) digester.parse(filename);
40 }
41
42 static Digester retrieveDigester() {
43 Digester digester = new Digester();
44 Rule rule = new PersFactoryRule();
45 digester.setValidating(false);
46 digester.addSetProperties("gums");
47 digester.addObjectCreate("gums/persistenceFactories/persistenceFactory", "", "className");
48 digester.addSetProperties("gums/persistenceFactories/persistenceFactory");
49 Rule rule5 = new PassProperties();
50 digester.addRule("gums/persistenceFactories/persistenceFactory", rule5);
51 digester.addSetNext("gums/persistenceFactories/persistenceFactory", "addPersistenceFactory", "gov.bnl.gums.PersistenceFactory");
52
53 digester.addObjectCreate("gums/adminUserGroup", "", "className");
54 SetPropertiesRule rule4 = new SetPropertiesRule(new String[] {"className", "persistenceFactory", "name"}, new String[]{});
55 rule4.setIgnoreMissingProperty(false);
56 digester.addRule("gums/adminUserGroup", rule4);
57 digester.addSetNext("gums/adminUserGroup", "setAdminGroup", "gov.bnl.gums.UserGroup");
58 digester.addRule("gums/adminUserGroup", rule);
59
60 digester.addObjectCreate("gums/groupMappings/groupMapping", GroupMapper.class);
61 digester.addSetProperties("gums/groupMappings/groupMapping");
62 digester.addSetNext("gums/groupMappings/groupMapping", "addGroupMapping", "gov.bnl.gums.GroupMapper");
63
64 digester.addObjectCreate("gums/groupMappings/groupMapping/userGroup", "", "className");
65 SetPropertiesRule rule3 = new SetPropertiesRule(new String[] {"className", "persistenceFactory", "name"}, new String[]{});
66 rule3.setIgnoreMissingProperty(false);
67 digester.addRule("gums/groupMappings/groupMapping/userGroup", rule3);
68 digester.addSetNext("gums/groupMappings/groupMapping/userGroup", "setGroup", "gov.bnl.gums.UserGroup");
69 digester.addRule("gums/groupMappings/groupMapping/userGroup", rule);
70
71 digester.addObjectCreate("gums/groupMappings/groupMapping/accountMapping", "", "className");
72 digester.addSetProperties("gums/groupMappings/groupMapping/accountMapping");
73 digester.addSetNext("gums/groupMappings/groupMapping/accountMapping", "setMapper", "gov.bnl.gums.AccountMapper");
74 digester.addRule("gums/groupMappings/groupMapping/accountMapping", rule);
75
76 digester.addObjectCreate("gums/groupMappings/groupMapping/compositeAccountMapping", "gov.bnl.gums.CompositeAccountMapper");
77 digester.addSetNext("gums/groupMappings/groupMapping/compositeAccountMapping", "setMapper", "gov.bnl.gums.AccountMapper");
78
79 digester.addObjectCreate("gums/groupMappings/groupMapping/compositeAccountMapping/accountMapping", "", "className");
80 digester.addSetProperties("gums/groupMappings/groupMapping/compositeAccountMapping/accountMapping");
81 digester.addSetNext("gums/groupMappings/groupMapping/compositeAccountMapping/accountMapping", "addMapper", "gov.bnl.gums.AccountMapper");
82 digester.addRule("gums/groupMappings/groupMapping/compositeAccountMapping/accountMapping", rule);
83
84 Rule rule2 = new GroupListRule();
85 digester.addObjectCreate("gums/hostGroups/hostGroup", "", "className");
86 digester.addSetProperties("gums/hostGroups/hostGroup");
87 digester.addSetNext("gums/hostGroups/hostGroup", "addHostGroup", "gov.bnl.gums.HostGroup");
88 digester.addRule("gums/hostGroups/hostGroup", rule2);
89
90 return digester;
91 }
92
93 private static class PassProperties extends Rule {
94
95 public void begin(String str, String str1, org.xml.sax.Attributes attributes) throws java.lang.Exception {
96 Object factory = getDigester().peek();
97 Properties properties = new Properties();
98 for (int nAtt = 0; nAtt < attributes.getLength(); nAtt++) {
99 String name = attributes.getQName(nAtt);
100 String value = attributes.getValue(nAtt);
101 log.trace("Adding " + name + " " + value + " propery");
102 properties.setProperty(name, value);
103 }
104 MethodUtils.invokeMethod(factory, "setProperties", properties);
105 }
106
107 }
108
109 private static class PersFactoryRule extends Rule {
110
111 public void begin(String str, String str1, org.xml.sax.Attributes attributes) throws java.lang.Exception {
112 if (attributes.getValue("persistenceFactory") != null) {
113 Configuration conf = (Configuration) getDigester().getRoot();
114 Object mapper = getDigester().peek();
115 MethodUtils.invokeMethod(mapper, "setPersistence", new Object[] {conf.getPersistenceFactories().get(attributes.getValue("persistenceFactory")), attributes.getValue("name")});
116 }
117 }
118
119 }
120
121 private static class GroupListRule extends Rule {
122
123 public void begin(String str, String str1, org.xml.sax.Attributes attributes) throws java.lang.Exception {
124 if (attributes.getValue("groups") != null) {
125 Configuration conf = (Configuration) getDigester().getRoot();
126 Object mapping = getDigester().peek();
127 StringTokenizer tokens = new StringTokenizer(attributes.getValue("groups"), ",");
128 List groups = new ArrayList();
129 while (tokens.hasMoreTokens()) {
130 String groupName = tokens.nextToken();
131 Object group = conf.getGroupMapping().get(groupName);
132 if (group == null) {
133 throw new IllegalArgumentException("The groupMapping '" + groupName + "' is used within a hostGroup, but it was not defined.");
134 }
135 groups.add(group);
136 }
137 MethodUtils.invokeMethod(mapping, "setGroupMapper", new Object[] {groups});
138 }
139 }
140
141 }
142
143 }